//
// Created by hsj on 2022/1/14.
//

#ifndef CLION_CPP_T_CLASS_MEMERY_H
#define CLION_CPP_T_CLASS_MEMERY_H
#include <cstring>
/**
 * 如果类的成员有指针类型：
 *                   最好是定义一个显示的复制构造函数
 *                   最好是定义一个重载赋值运算符
 */
namespace my_class_memery{
    using std::cout;
    using std::endl;

    //class内存占用
    void test_class_memery();

    //演示String类
    class StringBad{
        private:
            char *str;
            int len;
            // 存储在另外的静态存储中。
            // 不可以在类里面初始化，因为类是一个申明原型模板，不负责分配内存。
            static int num_strings;
            //枚举（推荐C++11，避免冲突）
            enum class SB:unsigned int{SB_007 = 7};
        public:
            StringBad(const char *);
            StringBad();
            ~StringBad();
            void numStringsPrint();
            //友元函数
            friend std::ostream & operator<<(std::ostream &,const StringBad &);

            //新增一些功能
            //比较函数作为友元函数，有助于与常规的C风格字符串比较。
            friend bool operator<(StringBad &st1,StringBad &st2){
                return (std::strcmp(st1.str,st2.str) < 0);
            };
            friend bool operator>(StringBad &st1,StringBad &st2){
                return st2.str < st1.str;
            };
            friend bool operator==(StringBad &st1,StringBad &st2){
                return (std::strcmp(st1.str,st2.str) == 0);
            };
//            常量保护策略
//            char & operator[](int i)const{
//                return str[i];
//            };
            const char & operator[](int i)const{
                return str[i];
            };
            //只能使用静态数据字段域
            static int howMany(){
                return num_strings;
            };

            //*****************************************************************
            //自动生成复制构造函数（创建对象的一个副本） ：StringBad(const StringBad &);
            //复制非静态成员
            //浅复制（如：指针）
            //*****************************************************************
            //定义一个显示的复制构造函数
            StringBad(const StringBad &);

            //*******************************************************************
            //重载赋值运算符
            //*******************************************************************
            //定义一个显示的重载赋值运算符
            StringBad & operator=(const StringBad &);
            StringBad & operator=(const char *);
};
}
#endif //CLION_CPP_T_CLASS_MEMERY_H
